/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Manejadores;

import Logica.Proyecto;
import Logica.Reunion;
import Logica.Usuario;
import Persistencia.ADOProyecto;
import Persistencia.ADOUsuario;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Matias
 */
public class ManejadorAgregarProyecto {

    private ADOProyecto adoPro;
    private ADOUsuario adoUsu;
    private Proyecto proyecto;
    private LinkedList reuniones;
    private LinkedList usuario;

    public ManejadorAgregarProyecto() {
        adoPro = new ADOProyecto();
        adoUsu = new ADOUsuario();
        reuniones = new LinkedList();
        usuario = new LinkedList();
    }
    
    //Trae un LinkedList de los proyectos actuales
    public LinkedList traerProyecto() {
        return adoPro.traerProyectos();
    }

    //Busco los usuarios habilitados, extraigo el nombre y devuelvo un array de nombres de usuarios
    public ArrayList traerUsuarios() {

        ArrayList<String> array = new ArrayList<String>();
        usuario = adoUsu.traerSoloUsuariosHabilitados();
        Iterator iter = usuario.iterator();

        while (iter.hasNext()) {
            Usuario aux = (Usuario) iter.next();
            array.add(aux.getNombreUsuario());
        }
        return array;
    }

    //cargo un modelo de lista con los usuarios traidos en el metodo anterior
    public DefaultListModel cargarListaUsuarios() {

        DefaultListModel modelo = new DefaultListModel();
        ArrayList array = traerUsuarios();
        Iterator iter = array.iterator();
        while (iter.hasNext()) {
            String aux = (String) iter.next();
            modelo.addElement(aux);
        }

        return modelo;
    }
    
    //Este metodo se encarga de actualizar la lista de Usuarios Activos y Asignados a gusto del usuario
    public DefaultListModel recargarListaUsuarios(String nombre) {
        ArrayList<String> array = new ArrayList<String>();
        Iterator iter = usuario.iterator();
        int cont = 0;
        boolean ban = true;
        //Recorro la lista de usuarios para agregar o quitar el usuario recibido por paramentro
        while (iter.hasNext()) {

            Usuario aux = (Usuario) iter.next();
            if (aux.getNombreUsuario().equals(nombre)) {//comparo que alguno coincida con el String que se recibe por paramentros, de ser asi significa que el mismo debe ser eliminado porque se presiono el boton "<"
                usuario.remove(cont);
                ban = false;
                break;
            }
            cont++;
        }
        if (ban) {//Si no se encontro coincidencia de usuarios significa que se presiono el boton ">" por lo cual el usuario debe ser agregado a la lista
            usuario.add(adoUsu.buscarUsuario(nombre));
        }
        //Recorro nuevamente la lista para copiar el LinkedList de usuarios a un ArrayList de nombres de usuarios
        Iterator iter3 = usuario.iterator();

        while (iter3.hasNext()) {
            Usuario aux = (Usuario) iter3.next();
            array.add(aux.getNombreUsuario());
        }
        //Cargo el modelo con el arrayList de String y luego lo envio por paramentros
        DefaultListModel modelo = new DefaultListModel();

        Iterator iter2 = array.iterator();

        while (iter2.hasNext()) {
            String aux = (String) iter2.next();
            modelo.addElement(aux);
        }

        return modelo;
    }
    
    //Valida que el nombre de la reunion sea correcto, osea que no este repetido
    public boolean validarNombreReunion(String reunion) {
        Reunion re = new Reunion(reunion);
        if (!reuniones.isEmpty()) {

            Iterator iter2 = reuniones.iterator();

            while (iter2.hasNext()) {
                Reunion aux = (Reunion) iter2.next();
                if (aux.getNombre().equals(re.getNombre())) {
                    return false;
                }
            }
        }
        return true;
    }
    
    //Valida que la tabla de reunion no se encuentre vacia
    public boolean validarReunionVacia() {

        if (reuniones.isEmpty()) {
            return false;
        }
        return true;
    }
   
    // Crea un modelo de tabla en base al un array de reuniones
    public DefaultTableModel cargarTablaReuniones(String reunion) {

        Reunion re = new Reunion(reunion);//creo una reunion con el nombr rcibido por paramentro

        reuniones.add((Reunion) re);// agrego la nueva reunion al array para mantener actualizada la tabla

        DefaultTableModel modeloResultado = new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Nombre"
                }) {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false; //Con esto conseguimos que la tabla no se pueda editar
            }
        };
        //Recorro la lista de reuniones y las agrego al modelo
        Iterator iter = reuniones.iterator();
        while (iter.hasNext()) {
            Reunion aux = (Reunion) iter.next();
            String[] o = {"" + aux.getNombre()};
            modeloResultado.addRow(o);
        }
        return modeloResultado;

    }

    //Quita elementos de la tabla de reuniones
    public DefaultTableModel recargarTablaReuniones(String reunion) {

        Reunion re = new Reunion(reunion);

        DefaultTableModel modeloResultado = new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Nombre"
                }) {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false; //Con esto conseguimos que la tabla no se pueda editar
            }
        };
        //recorro la lista de reuniones para quitar aquella reunion que se recibe por parametros
        Iterator iter = reuniones.iterator();
        int count = 0;
        while (iter.hasNext()) {
            Reunion aux = new Reunion();
            aux = (Reunion) iter.next();
            if (aux.getNombre().equals(reunion)) {
                reuniones.remove(count);
                break;
            }
            count++;
        }
        //recorro nuevamente el array para agregar los elementos actuales a un nuevo modelo que se retorna        
        Iterator iter2 = reuniones.iterator();
        while (iter2.hasNext()) {
            Reunion aux = (Reunion) iter2.next();
            String[] o = {"" + aux.getNombre()};
            modeloResultado.addRow(o);
        }
        return modeloResultado;

    }
    
    //Borra todos los elementos de una tabla despues de haber agregado el proyecto
    public DefaultTableModel LimpiarTablaReuniones() {

        DefaultTableModel modeloResultado = new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Nombre"
                }) {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false; //Con esto conseguimos que la tabla no se pueda editar
            }
        };

        reuniones.clear();

        return modeloResultado;

    }
    
    //recibe un array de usuarios y el proyecto para luego crear el proyecto
    public boolean datosProyecto(ArrayList<String> array, String nombre) {

        ArrayList<Reunion> arrayReunion = new ArrayList<Reunion>();
        ArrayList<Usuario> arrayUsuario = new ArrayList<Usuario>();
        Iterator iter = reuniones.iterator();

        while (iter.hasNext())//agarro el LinkedList de reuniones y lo hago un ArrayList
        {
            arrayReunion.add((Reunion) iter.next());
        }
        Iterator iter2 = array.iterator();

        while (iter2.hasNext())//Busco cada usuario del array de usuarios por nombre y genero un ArrayList de objetos usuarios
        {
            String aux = ((String) iter2.next());
            arrayUsuario.add(adoUsu.buscarUsuario(aux));

        }
        return insertarProyecto(arrayReunion, arrayUsuario, nombre);
    }
    
    //Valida que el nombre de proyecto ingresado no exista
    public boolean validarNombreProyecto(String nombre) {

        if (adoPro.traerProyectoPorNombre(nombre) == null) {
            return true;
        } else {
            return false;
        }
    }

    //Inserta el proyecto en la base de datos
    public boolean insertarProyecto(ArrayList<Reunion> reunion, ArrayList<Usuario> usuario, String nombre) {
        proyecto = new Proyecto(nombre);
        proyecto.setReuniones(reunion);
        proyecto.setUsuarios(usuario);
        return adoPro.insertarProyecto(proyecto);//inserto el proyecto, delvuelve true o false segun se haya insertado o no

    }
}
